gl: Fix issue with EGL + nvidia
authorBenjamin Otte <otte@redhat.com>
Sat, 10 Jul 2021 00:29:17 +0000 (02:29 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 22 Jul 2021 14:28:16 +0000 (16:28 +0200)
nvidia sets the default draw buffer to GL_NONE if EGL contexts are
initially bound to EGL_NO_SURFACE which is exactly what we are doing. So
bind them to GL_BACK when drawing, as they should be.

See https://phabricator.services.mozilla.com/D118743 for a discussion
about EGL_NO_CONTEXT and draw buffers.

gdk/wayland/gdkglcontext-wayland.c
gdk/x11/gdkglcontext-egl.c

index 558c9cfed0c3dd3c3a40df80cce125d3c233ebac..0bc24824f6023d82d63a0a6becbda838d3cb336e 100644 (file)
@@ -276,6 +276,16 @@ gdk_wayland_gl_context_make_current (GdkGLContext *context,
                          egl_surface,
                          context_wayland->egl_context);
 }
+
+static void
+gdk_wayland_gl_context_begin_frame (GdkDrawContext *draw_context,
+                                    cairo_region_t *region)
+{
+  GDK_DRAW_CONTEXT_CLASS (gdk_wayland_gl_context_parent_class)->begin_frame (draw_context, region);
+
+  glDrawBuffers (1, (GLenum[1]) { GL_BACK });
+}
+
 static void
 gdk_wayland_gl_context_end_frame (GdkDrawContext *draw_context,
                                   cairo_region_t *painted)
@@ -337,6 +347,7 @@ gdk_wayland_gl_context_class_init (GdkWaylandGLContextClass *klass)
 
   gobject_class->dispose = gdk_wayland_gl_context_dispose;
 
+  draw_context_class->begin_frame = gdk_wayland_gl_context_begin_frame;
   draw_context_class->end_frame = gdk_wayland_gl_context_end_frame;
 
   context_class->realize = gdk_wayland_gl_context_realize;
index a4de68d22846b05ef8b4323cda0af4722264ec1b..eb5fd337245c46cbf6546cda1b6dbcfec98c0451 100644 (file)
@@ -312,6 +312,15 @@ gdk_x11_surface_destroy_egl_surface (GdkX11Surface *self)
   self->egl_surface = NULL;
 }
 
+static void
+gdk_x11_gl_context_egl_begin_frame (GdkDrawContext *draw_context,
+                                    cairo_region_t *region)
+{
+  GDK_DRAW_CONTEXT_CLASS (gdk_x11_gl_context_egl_parent_class)->begin_frame (draw_context, region);
+
+  glDrawBuffers (1, (GLenum[1]) { GL_BACK });
+}
+
 static void
 gdk_x11_gl_context_egl_end_frame (GdkDrawContext *draw_context,
                                   cairo_region_t *painted)
@@ -638,6 +647,7 @@ gdk_x11_gl_context_egl_class_init (GdkX11GLContextEGLClass *klass)
   context_class->clear_current = gdk_x11_gl_context_egl_clear_current;
   context_class->get_damage = gdk_x11_gl_context_egl_get_damage;
 
+  draw_context_class->begin_frame = gdk_x11_gl_context_egl_begin_frame;
   draw_context_class->end_frame = gdk_x11_gl_context_egl_end_frame;
 
   gobject_class->dispose = gdk_x11_gl_context_egl_dispose;